﻿/*
 文件名：baidumap.js
 文件用途：百度地图jquery插件，封装地图常用各类操作方法
 创建人：whb
 创建日期：2014-12-17
*/
document.write('<scr' + 'ipt type=\"text/javascript\" src=\"http://api.map.baidu.com/api?v=2.0&ak=nQqwnUMPi3TqGlGPFM6YwoyL\"></scr' + 'ipt>');
document.write('<scr' + 'ipt type=\"text/javascript\" src=\"js/BaiduMapEventWrapper.min.js\"></scr' + 'ipt>');
document.write('<scr' + 'ipt type=\"text/javascript\" src=\"js/BaiduMapRichMarker.min.js\"></scr' + 'ipt>');
(function($){
	// 定义地图对象
	$.fn.baidumap = function(opts) {
			var options = $.extend({}, $.fn.baidumap.defaults, opts);
			var map = new BMap.Map(this.attr("id"));

			$.fn.baidumap.options = options;
			$.fn.baidumap.map = map;
			$.fn.baidumap.initmap();		// 地图初始化
			return $.fn.baidumap;
	};
	
	// 地图初始化
	$.fn.baidumap.initmap = function() {
			var map = $.fn.baidumap.map;
			var options = $.fn.baidumap.options;
			
			var point = new BMap.Point(options.point.lat, options.point.lng);
			map.centerAndZoom(point, options.zoom);
			if(options.scrollWheelZoom){
				map.enableScrollWheelZoom();		// 支持鼠标滚轮缩放地图
			}
			if(options.navigationCtl){
				var nav_control = new BMap.NavigationControl();	// 地图左上角显示默认的平移及缩放控件
				map.addControl(nav_control);
			}
			if(options.boundary.show){
				$.fn.baidumap.showBoundary(options.boundary.areaName, options.boundary.setViewport,true,'');
			}
	};
	
	// 显示分界线
	$.fn.baidumap.showBoundary = function(areaName, setViewport,isaddZZ,fillC) {
			var map = $.fn.baidumap.map;
			var bdary = new BMap.Boundary();
			bdary.get(areaName, function (rs) {       //获取行政区域
				//map.clearOverlays();        //清除地图覆盖物
		
				//添加遮罩层
				//思路：利用行政区划点的集合与外围自定义东南西北形成一个环形遮罩层
				//1.获取选中行政区划边框点的集合  rs.boundaries[0]
				var strs = new Array();
				strs = rs.boundaries[0].split(";");
				var EN = "";    //行政区划东北段点的集合
				var NW = ""; //行政区划西北段点的集合
				var WS = ""; //行政区划西南段点的集合
				var SE = ""; //行政区划东南段点的集合
				var pt_e = strs[0]; //行政区划最东边点的经纬度
				var pt_n = strs[0]; //行政区划最北边点的经纬度
				var pt_w = strs[0]; //行政区划最西边点的经纬度
				var pt_s = strs[0]; //行政区划最南边点的经纬度
				var n1 = ""; //行政区划最东边点在点集合中的索引位置
				var n2 = ""; //行政区划最北边点在点集合中的索引位置
				var n3 = ""; //行政区划最西边点在点集合中的索引位置
				var n4 = ""; //行政区划最南边点在点集合中的索引位置
		
				//2.循环行政区划边框点集合找出最东南西北四个点的经纬度以及索引位置
				for (var n = 0; n < strs.length; n++) {
					var pt_e_f = parseFloat(pt_e.split(",")[0]);
					var pt_n_f = parseFloat(pt_n.split(",")[1]);
					var pt_w_f = parseFloat(pt_w.split(",")[0]);
					var pt_s_f = parseFloat(pt_s.split(",")[1]);
		
					var sPt = new Array();
					try {
						sPt = strs[n].split(",");
						var spt_j = parseFloat(sPt[0]);
						var spt_w = parseFloat(sPt[1]);
						if (pt_e_f < spt_j) {   //东
							pt_e = strs[n];
							pt_e_f = spt_j;
							n1 = n;
						}
						if (pt_n_f < spt_w) {  //北
							pt_n_f = spt_w;
							pt_n = strs[n];
							n2 = n;
						}
		
						if (pt_w_f > spt_j) {   //西
							pt_w_f = spt_j;
							pt_w = strs[n];
							n3 = n;
						}
						if (pt_s_f > spt_w) {   //南
							pt_s_f = spt_w;
							pt_s = strs[n];
							n4 = n;
						}
					}
					catch (err) {
						alert(err);
					}
				}
				//3.得出东北、西北、西南、东南四段行政区划的边框点的集合
				if (n1 < n2) {     //第一种情况 最东边点在索引前面
					for (var o = n1; o <= n2; o++) {
						EN += strs[o] + ";"
					}
					for (var o = n2; o <= n3; o++) {
						NW += strs[o] + ";"
					}
					for (var o = n3; o <= n4; o++) {
						WS += strs[o] + ";"
					}
					for (var o = n4; o < strs.length; o++) {
						SE += strs[o] + ";"
					}
					for (var o = 0; o <= n1; o++) {
						SE += strs[o] + ";"
					}
				}
				else {   //第二种情况 最东边点在索引后面
					for (var o = n1; o < strs.length; o++) {
						EN += strs[o] + ";"
					}
					for (var o = 0; o <= n2; o++) {
						EN += strs[o] + ";"
					}
					for (var o = n2; o <= n3; o++) {
						NW += strs[o] + ";"
					}
					for (var o = n3; o <= n4; o++) {
						WS += strs[o] + ";"
					}
					for (var o = n4; o <= n1; o++) {
						SE += strs[o] + ";"
					}
				}
				//4.自定义外围边框点的集合
				var E_JW = "170.672126, 39.623555;";            //东
				var EN_JW = "170.672126, 81.291804;";       //东北角
				var N_JW = "105.913641, 81.291804;";        //北
				var NW_JW = "-169.604276,  81.291804;";     //西北角
				var W_JW = "-169.604276, 38.244136;";       //西
				var WS_JW = "-169.604276, -68.045308;";     //西南角
				var S_JW = "114.15563, -68.045308;";            //南
				var SE_JW = "170.672126, -68.045308 ;";         //东南角
				//4.添加环形遮罩层
				var ply1 = new BMap.Polygon(EN + NW + WS + SE + E_JW + SE_JW + S_JW + WS_JW + W_JW + NW_JW + EN_JW + E_JW, { strokeColor: "none", fillColor: "rgb(246,246,246)", strokeOpacity: 0 }); //建立多边形覆盖物
				if(isaddZZ)
				map.addOverlay(ply1);  //遮罩物是半透明的，如果需要纯色可以多添加几层
				//5. 给目标行政区划添加边框，其实就是给目标行政区划添加一个没有填充物的遮罩层
				var ply = new BMap.Polygon(rs.boundaries[0], { strokeWeight: 1, strokeColor: "#000000",fillColor:fillC });
				map.addOverlay(ply);
				if(setViewport) {
					map.setViewport(ply.getPath());    //调整视野
				}
			});
	};

	// 定义默认地图样式
	$.fn.baidumap.defaults = {
			point: { lat:116.39755, lon:39.843129 },					// 初始坐标位置
			zoom: 8,																					// 缩放级别
			scrollWheelZoom: true,														// 是否支持地图滚轮缩放，默认支持
			navigationCtl: false,															// 是否显示平移控件及缩放控件，默认为否
			boundary: { show:false }													// 是否显示分界线，默认不显示，其余设置为：{ show:true, areaName:"行政区中文名称，如北京市等" }
	};
	
	// 定位到指定坐标（指定缩放级别）
	$.fn.baidumap.panToAndZoom = function(x, y, zoom) {
			var map = $.fn.baidumap.map;
			map.clearOverlays();
			if (parseInt(x) == 0) {
				return;
			}
			if (x != "") {
				var temp_point = new BMap.Point(x, y);
				map.centerAndZoom(temp_point, parseInt(zoom));
			}
  };
  
  // 定位到指定坐标
  $.fn.baidumap.panTo = function(x, y) {
  		var map = $.fn.baidumap.map;
  		if (parseInt(x) == 0) {
				return;
			}
  		var point = new BMap.Point(x, y);
  		map.panTo(point);
  		return point;
  };
  
  // 添加一个标注点
  $.fn.baidumap.addmarker = function(options) {
  		var point = new BMap.Point(options.point.lat, options.point.lng);
			var marker = new BMap.Marker(point);
			if (options.icon) {
				
				//var icon = new BMap.Icon(options.icon.url, new BMap.Size(options.icon.width, options.icon.height));
				//marker.setIcon(icon);
				$.fn.baidumap.seticon(marker, options.icon);
			}
			if (options.label) {
				var opts = {
		  		position : point,    // 指定文本标注所在的地理位置
		  		offset   : new BMap.Size(options.label.offset.x, options.label.offset.y)    //设置文本偏移量
				
				};
				var label = new BMap.Label(options.label.text, opts);
				label.setStyle({
					color : "blue",
					fontSize : "12px",
					height : "20px",
					border : "0",
					lineHeight : "20px",
					fontFamily:"微软雅黑"
		 		});
				marker.setLabel(label);
			}
			if (options.offset) {
				marker.setOffset(new BMap.Size(options.offset.x, options.offset.y));
			}
			if (options.infoWindow) {
				// 增加弹窗事件触发定制 add by whb 150408
				if(options.infoWinEventName){
					marker.addEventListener(options.infoWinEventName, function(){
						$.fn.baidumap.map.openInfoWindow(options.infoWindow, point);
						if(options.click){
							options.click();
						}
					});

				}
				else{
					marker.addEventListener("click", function(){
						$.fn.baidumap.map.openInfoWindow(options.infoWindow, point);
						if(options.click){
							options.click();
						}
					});
				}
			}
			$.fn.baidumap.map.addOverlay(marker);
			return marker;
  };
  
  // 添加一个富标注点
  $.fn.baidumap.addRichMark = function(options) {
		var point = new BMap.Point(options.point.lat, options.point.lng);
		var marker;
		if(options.anchor.show) {
			marker = new BMapLib.RichMarker(options.content, point, {"anchor" : new BMap.Size(options.anchor.offset_x, options.anchor.offset_y), "enableDragging" : options.enableDragging});
		}
		else{
			marker = new BMapLib.RichMarker(options.content, point, {"enableDragging" : options.enableDragging});
		}
		$.fn.baidumap.map.addOverlay(marker);
		return marker;
  };
  
  // 删除一个标注点
  $.fn.baidumap.removemarker = function(marker) {
  		$.fn.baidumap.map.removeOverlay(marker);
  };
  
  // 为标注点设置指定图标
  $.fn.baidumap.seticon = function(marker, options) {
  		var icon = new BMap.Icon(options.url, new BMap.Size(options.width, options.height));
			marker.setIcon(icon);
  };
  
  // 添加一组标注点
  $.fn.baidumap.addmarkers = function(options) {
  		var markerArr = new Array();
  		$.each(options, function(k, v){
  				var marker = $.fn.baidumap.addmarker(v);
  				markerArr.push(marker);
  		});
  		return markerArr;
  };
  
  // 添加一组富标注点
  $.fn.baidumap.addRichMarkers = function(options) {
  		var markerArr = new Array();
  		$.each(options, function(k, v){
  				var marker = $.fn.baidumap.addRichMark(v);
  				markerArr.push(marker);
  		});
  		return markerArr;
  };
  
  // 删除一组标注点
  $.fn.baidumap.removemarkers = function(markers) {
  		/*$.each(markers, function(k, v){
  			$.fn.baidumap.map.removemarker(v);
  		});*/
		for(var i=0; i<markers.length; i++){
			ts.removemarker(markers[i]);
		}
  };
  
  // 清空所有覆盖物
  $.fn.baidumap.clearOverlays = function() {
		$.fn.baidumap.map.clearOverlays();
  };
  
  // 返回标注点坐标
  $.fn.baidumap.getMarkerPos = function(marker) {
  		if(marker){
  			return marker.getPosition();
  		}
  		return new BMap.Point(0, 0);
  };
  
  // 触发标注点事件
  $.fn.baidumap.triggerMarker = function(marker, event) {
  		marker.dispatchEvent(event);
  };
  
  // 添加一个信息窗口
  $.fn.baidumap.addInfoWindow = function(content, opts) {
  		return new BMap.InfoWindow(content, opts);
  };
  
  // 返回一个百度位置类型对象Size
  $.fn.baidumap.Size = function(x, y) {
		return new BMap.Size(x, y);
  };
  
  // 添加一个自定义面板
  $.fn.baidumap.addCustomPanel = function(options) {
  		function myControl(){
				// 默认停靠位置和偏移量
				this.defaultAnchor = BMAP_ANCHOR_TOP_LEFT;
				this.defaultOffset = new BMap.Size(10, 10);
			}
			
			// 通过JavaScript的prototype属性继承于BMap.Control
			myControl.prototype = new BMap.Control();
			
			// 自定义控件必须实现自己的initialize方法,并且将控件的DOM元素返回
			// 在本方法中创建个div元素作为控件的容器,并将其添加到地图容器中
			myControl.prototype.initialize = function(map){
				// 创建一个DOM元素
				var div = document.createElement("div");
			
				div.id = options.id;
				div.innerHTML = options.content;
				div.style.width = options.width;
				div.style.cursor = "pointer";
				div.style.border = "1px solid gray";
				div.style.backgroundColor = "white";
			
				// 添加DOM元素到地图中
				map.getContainer().appendChild(div);
				// 将DOM元素返回
				return div;
			}
			
			var myCtrl = new myControl();
			$.fn.baidumap.map.addControl(myCtrl);
			return myCtrl;
  };
  
  // 自定义面板显示/隐藏切换
  $.fn.baidumap.togglePanel = function(panel) {
  		if(panel){
  			panel.isVisible() ? panel.hide() : panel.show();
  		}
  };
})(jQuery);